﻿#ifndef MainWidget_H
#define MainWidget_H

#include <QDebug>
#include <QWidget>
#include <QDateTime>
#include <QResource>
#include <QMouseEvent>
#include <QHash>
#include <QDirIterator>
#include <QSharedPointer>
#include "main.h"
#include "mctype/mainwidgetfunction.h"
#include "sharedviews/promptdialog.h"
#include "sharedviews/patternselectwidget.h"
#include "sharedviews/parametersetdialog.h"
#include "sharedviews/patternmanagewidget.h"
#include "sharedviews/sensorinputwidget.h"
#include "sharedviews/controlactionwidget.h"
#include "sharedviews/knifegapparadialog.h"
#include "mctype/patternsingleboard/function/highsinglequilting.h"
#include "machine/error.h"
#include "sharedviews/headspacingsheetdialog.h"
#include "mctype/patternsingleboard/function/fiveheadprecisionsewing.h"
#include "mctype/patternsingleboard/function/clothingmac.h"
#include "mctype/patternsingleboard/function/multineedlerotary.h"
#include "mctype/patternsingleboard/function/flatcuttingmac.h"
#include "mctype/patternsingleboard/function/flyflatcutting.h"
#include "mctype/patternsingleboard/function/thickwiringmac.h"
#include "mctype/patternsingleboard/function/drawingmac.h"
#include "sharedviews/setcontrolstyle.h"
#include "machine/mytcpserver.h"

namespace Ui {
class MainWidget;
}

typedef struct
{
    s16 rotateStyle;             //旋转式样
    s16 rotateAngle;           //旋转角度
    s16 reinMode;               //加固方式
    s16 reinNeedles;           //加固针数
    s16 reinNum;                 //加固次数
    s32 normalStep;           //针步大小
    s32 angleCorrOffset;    //角度修正量
    s32 angleCorrPosX;      //角度修正x正
    s32 angleCorrNegX;     //角度修正x负
    s32 angleCorrPosY;       //角度修正y正
    s32 angleCorrNegY;     //角度修正y负
    s32 left;                        //左边
    s32 front;                     //前边
    s32 scanX;                    //缩放x
    s32 scanY;                    //缩放y
    s32 startX;                    //起始点X
    s32 startY;                    //起始点Y
    s32 anchorX;                //定位点X
    s32 anchorY;                //定位点Y
    s32 bisect;                 //平分参数
    s32 cornerneedle;       //拐角增加针步标志
    s32 cutneedle;          //拐角分割针步标志
}__attribute__ ((packed)) PatternSetPara;

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent = 0);
    ~MainWidget();

private:
    Ui::MainWidget *ui;
    PatternSelectWidget *m_pPatternSelectWi;//花样选择窗体
    ParameterSetDialog *m_pParameterSetDlg;//参数设定窗体
    PatternManageWidget *m_pPatternManageWi;//花样管理窗体(花样导入、导出...)
    SensorInputWidget *m_pSensorInputWi;
    ControlActionWidget *m_pControlActionWi;
    MainWidgetFunction *m_pMainWidgetFunction;//快捷功能函数结构体
    QSharedPointer<KnifeGapParaDialog> m_pKnifeGapParaDlg;
    Machine * m_pMachine;
    QThread * m_pScanComThread; //扫码器
    ComPort * m_pScanComPort; //扫码器串口
    QSharedPointer<MyTcpServer> m_pTcpServer;//平板切割机 文件服务器
    QSharedPointer<QThread> m_pTcpServerThread; //服务器 线程

    QList<MyButton*> m_quickBtnList;//快捷功能中的快捷按钮列表
    QList<QLabel*> m_quickLabelList;//快捷功能中的label显示列表

    QList<MyButton*> m_assistBtnList;//辅助功能中的辅助按钮列表
    QList<QLabel*> m_assistLabelList;//辅助功能中的label显示列表

    QList<MyButton*> m_patternSetBtnList;//花样设置中的花样设置按钮列表
    QList<QLabel*> m_patternSetLabelList;//花样设置中的label显示列表

    QList<MyButton*> m_paraSetBtnList;//参数设置中的参数设置按钮列表
    QList<QLabel*> m_paraSetLabelList;//参数设置中的label显示列表
    QHash<int,NineItem> m_nineBtn; //九宫格四角按钮的机型化配置
    QList<PATTERNINFO> m_fileInfo;//右上角花样信息显示
	
	QString m_usbPath;//优盘路径
    QString m_rootPath;//操作屏根路径
    QString m_curPath;//当前路径

    int m_pageNums;//总页数
    int m_curPages;//快捷界面当前页数
    s16 m_backPosFlag;//0,回工作点       1，回上次切割点

private:
    void initialize();//初始化

public:
    void initAllWindows(s16 ifHMIDecrypt = 1, s16 connectMode = 0);//初始化窗体
    void initMcTypeWindows();//不同机型不同的窗体设置
    void setLabelTitleText(MachineType type);

private:
    void initQuickFunBtn();//初始化快捷功能中的快捷按钮
    QList<ShortCutItem> m_quickItemList;//快捷功能中的快捷条目列表

    void initAssisitBtn();//初始化辅助功能中的辅助按钮
    QList<AssistItem> m_assistItemList;//辅助功能中的辅助按钮列表

    void initPatternSetBtn();//初始化花样设置功能中的花样设置按钮
    QList<PatternSetItem> m_patternSetItemList;//花样设置功能中的花样设置条目列表

    void initParaSetBtn();//初始化参数设置功能中的参数设置按钮
    QList<ParaSetItem> m_paraSetItemList;//参数设置功能中的参数设置条目列表

    void initPatternInfo(int beginX, int beginY,  int width, int height);
    QList<ErrorCodeStateItem> m_errorCodeAndStateItemList;//错误代码和状态列表

private:
    u32 m_workStatus;//工作状态
    int m_curRpm;
    int m_curDatIdx;//当前针数索引

    int m_forwardBackNeedleIdx;//前进回退时的针数索引
    s16 m_ifHMIDecrypt;//界面是否授权，1代表已授权解密过，0代表未授权解密过
    s16 m_connectMode;//通讯连接方式 0:网口，1:串口

private:
    MCStatus m_mcStatus;
    u32 m_errorCode;//记录报错代码

    int m_initflag;//初始化标志
    int m_timoutflag;//超时标志
    QTimer * m_pTimer;//建立连接的定时器
    QTimer * m_pConTimer;//检测上下位机心跳包的定时器
    QTimer * m_pMinTimer;//记录当前时间的定时器
    QTimer * m_pRefreshVer;  //刷新版本信息
    QTimer * m_pWifiConTimer;//检测wifi是否连接的定时器
    SetStyle m_setControlStyle;

    QTimer * m_pRefreshPatternTimer;//更新花样显示的定时器(测试用)

    int m_conFlag;//连接标志
    int m_linkSta;//连接状态
    int m_itemPerPage;//快捷界面每页按钮数

    EmbData::DISP_MODE m_dispMode;
    QPixmap *m_previewImage;

    QString m_curFilePath;//当前选择的花样路径
    int m_imageZoom;//花样图片缩放值
    int m_imageMoveX;//花样图片平移值X
    int m_imageMoveY;//花样图片平移值Y

    int m_curFileFlag;

    PatternSetPara m_patternSetPara;//花样参数
    QPixmap m_embBackPix;//绘制预览图的背景图
    FileExecPara m_expara;

private:
    int m_speedLevel;//速度等级

private:
    void setFrameNineBtnStyle();

private:
    void clearFileInfo();//清除文件信息
    void initControl();//初始化窗体控件，包括位置、尺寸、样式
    void initResolution();
    void initControlStyle();//初始化窗体控件样式
    QString getBackImagePath(s16 waterMark);//获取背景图的加载路径
    void showWorkSpeed(QString speed); //用数字管显示速度
    void setViewFont(QFont font);  //设置界面字体大小
    void refreshPageUi(s16 type);//刷新界面显示
	
	//鼠标事件
protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);

private:
    int mousePressX;
    int mousePressY;
    int mouseReleaseX;
    int mouseReleaseY;

private:
    void sendInitString(QString str);//发送初始化字符串
    void refConnectUi(int alive);//刷新连接状态(1秒)

    //刷新连接状态
    void refConnectUi(Machine * pMachine,int & linkSta, int alive);
    void hideMenuFrame();//隐藏菜单栏(frame)
    void showDiffPara(QString ext,s16 setFlag = 0);//根据文件格式不同显示不同花样参数
    void calPointsAndSet(s16 type = 0);//计算起始点和定位点并设置
    s16 appendDiffAbsData(QString ext);//根据文件格式不同添加不同的绝对坐标中间数据
    void resetAllData();//重置所有数据
    void patternSelect();//花样选择

private:
    void showExecInfo();//显示机器运行状态中的信息
    void showPatternPreview();//显示花样显示页面

private:
    QString getCommonBtnStyle(int idx);//获取常用按钮样式
    void runCommonBtnFunction(int idx);//执行常用按钮功能
    void runAssistBtnFunction(int funEnum,int idx);//执行辅助按钮功能
    void runPatternSetBtnFunction(int funEnum,int idx);//执行花样设置按钮功能
    void setUiBtnEnable(bool bValue);//设置UI界面按钮的使能
    void showSpeedFrame(); //隐藏九宫格 显示速度
    void showNineFrame(); //隐藏速度 显示九宫格
    void setNotExecing();//不是执行状态，重置

private:
    void reSetDatIdx(int newidx);
    void funForwardOrBack();//前进回退
    void addOrDecNeedleIdx(int &idx); //加减针

signals:
    void siSendLoadingMessage(QString info, int alignment, QColor color);//接受加载信息
    void siSpeed(int speed);//手动换挡

private slots:
    void slotWaitTimout();//等待超时
    void slotMachineStatus(int toggle);//机器状态
    void slotShowPercentage(int val);
    void slotRefreshWifiIcon(bool bl);
    //void slotLotDat();   //测试物联网用

private slots:
    void onRefreshVer();//刷新版本信息定时器

    //选择花样后是否弹出花样参数设置窗体并设置花样参数(默认显示花样参数设置窗体)
    void slotShowPatternPara(QString filePath,s16 showFlag = 0);//设置花样参数
    void slotShowPara(QString suffix);//设置分割参数
    void slotTcpRecvFile(QString filePath);
    void slotIfFileExist();//删除文件后判断当前文件是否被删除
    void slotClearPatternFcg();//删除fcg后重新选择花版
    void slotReplacePattrn(QString path);//花样导入替换文件
    void slotSetPatternData();//设置花样数据

public slots:
    void slotChangeProgressBar(int value);

private slots:
    void slotQuickBtnClick();//快捷功能中的快捷按钮被点击
    void slotAssistBtnClick();//辅助功能中的辅助功能按钮被点击
    void slotPatternSetBtnClick();//花样设置中的花样设置按钮被点击
    void slotParaTypeBtnClick();//参数设置中的参数功能按钮被点击
    void slotSetButtonRootLogo(int level);//设置超级用户图标
    void slotClearPatternBreakLineNum();//清空花版断线次数
    void slotDebugState();//界面调试模式
    void slotReceScanData(QByteArray data);//接收扫码器数据
    void slotDebugInfo();
private slots:
    void onRefreshPatternTimer();//1秒定时器(刷新花样测试用)
    void onOneSecondTimer();//1秒定时器
    void onFiveSecondTimer();//5秒定时器
    void onTenMiniteTimer();//10分钟定时器
    void onOneMinTimer();//1分钟定时器
    void on_buttonMainMenu_clicked();//主界面按钮
    void on_buttonPatternSet_clicked();//花样设置按钮
    void on_buttonParaSet_clicked();//参数设定按钮
    void on_buttonShortcutFunction_clicked();//快捷功能按钮
    void on_buttonAccessFunction_clicked();//辅助功能按钮

    void on_buttonSpeedAdd_clicked();
    void on_buttonSpeedDec_clicked();
    void on_buttonNineBtnUp_pressed();
    void on_buttonNineBtnUp_released();
    void on_buttonNineBtnDown_pressed();
    void on_buttonNineBtnDown_released();
    void on_buttonNineBtnLeft_pressed();
    void on_buttonNineBtnLeft_released();
    void on_buttonNineBtnRight_pressed();
    void on_buttonNineBtnRight_released();
    void on_buttonNineBtnMiddle_pressed();//九宫格中间键按下
    void on_buttonNineBtnMiddle_released();//九宫格中间键抬起
    void on_buttonNineBtn1_clicked();
    void on_buttonNineBtn2_clicked();
    void on_buttonNineBtn3_clicked();
    void on_buttonNineBtn4_clicked();
    void on_buttonNeedleBegin_clicked();
    void on_buttonNeedleEnd_clicked();
    void on_buttonNeedleDec1_clicked();
    void on_buttonNeedleAdd1_clicked();
    void on_buttonNeedleDec10_clicked();
    void on_buttonNeedleAdd10_clicked();
    void on_buttonNeedleDec100_clicked();
    void on_buttonNeedleAdd100_clicked();
    void on_buttonNeedleDec1000_clicked();
    void on_buttonNeedleAdd1000_clicked();
    void on_buttonNeedleDec10000_clicked();
    void on_buttonNeedleAdd10000_clicked();
    void on_buttonForwardBackOk_clicked();
    void on_buttonForwardBackCancel_clicked();
    void on_buttonUser_clicked();
    void on_buttonStartStop_clicked();
    void on_buttonElementAdd_clicked();
    void on_buttonElementDec_clicked();
    void on_buttonMove_pressed();
    void on_buttonMove_released();
    void on_buttonAssistPgDn_clicked();
    void on_buttonAssistPgUp_clicked();
    void on_buttonShortCutPgDn_clicked();
    void on_buttonShortCutPgUp_clicked();
    void on_buttonNineBtn4_released();
    void on_buttonNineBtn3_released();
    void on_buttonNineBtn3_pressed();
    void on_buttonNineBtn4_pressed();
};

#endif // MainWidget_H
